package main

import (
	"goblockchain/cli"
	"os"
)

/*
共识机制
我们常说区块链是一个分布式系统，系统中每个节点都有机会储存数据信息构造一个区块然后追加到区块链尾部。
这里就存在一个问题，那就是当区块链系统中有多个节点都想将自己的区块追加到区块链时我们该怎么办？
我们将这些等待添加的区块统称为候选区块，显然我们不能对候选区块全盘照收，否则区块链就不再是一条链
而是不断分叉成区块树。那么我们如何确定一种方法来从候选区块中选择一个加入到区块链中了？
这里就需要用到区块链的共识机制，后文将以比特币使用的最经典PoW共识机制进行讲解。

共识机制说的通俗明白一点就是要在相对公平的条件下让想要添加自己的候选区块进区块链的节点内卷，
通过竞争选择出一个大家公认的节点来添加它的区块进入区块链。整个共识机制被分为两部分，
首先是竞争，然后是共识。中本聪在比特币中设计了如下的一个Game来实现竞争：
每个节点去寻找一个随机值（也就是nonce），将这个随机值作为候选区块的头部信息属性之一，
要求候选区块对自身信息（注意这里是包含了nonce的）进行哈希后，将哈希值表示为数值，
该数值要小于一个难度目标值（也就是Target），最先寻找到nonce的节点即为卷王，
可以将自己的候选区块发布并添加到区块链尾部。这个Game设计的非常巧妙，
首先每个节点要寻找到的nonce只对自己候选区块有效，防止了其它节点同学抄答案；
其次，nonce的寻找是完全随机的没有技巧，寻找到nonce的时间与目标难度值与节点本身计算性能有关，
但不妨碍性能较差的节点也有机会获胜；最后寻找nonce可能耗费大量时间与资源，
但是验证卷王是否真的找到了nonce却能够很快完成并几乎不需要耗费资源，
这个寻找到的nonce可以说就是卷王真的是卷王的证据。现在我们就来一步一步实现这个Game。

*/

func main() {
	defer os.Exit(0)
	cmd := cli.CommandLine{}
	cmd.Run()
}
